﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УчетнаяЗапись 			= Параметры.УчетнаяЗапись;
	СостояниеЗаявления		= Параметры.СостояниеЗаявления;
	ОбновитьАвтоматически	= Параметры.ОбновитьАвтоматически;
	РежимВвода				= Параметры.РежимВвода;
	ДоступныеРазделы		= ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДоступныеРазделы", Новый Массив);
	
	Если РежимВвода Тогда
		ВсеРеквизиты = ПолучитьДанныеЗаявления(Параметры.СодержимоеЗаявления);
	ИначеЕсли СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено Тогда
		ВсеРеквизиты = ПолучитьДанныеЗаявления(Справочники.УчетныеЗаписиDSS.ПустаяСсылка());
		ВсеРеквизиты.СостояниеЗаявления = СостояниеЗаявления;
	Иначе
		ВсеРеквизиты = ПолучитьДанныеЗаявления(УчетнаяЗапись);
	КонецЕсли;
	
	ЗаполнитьФормуДаннымиЗаявления(ВсеРеквизиты);
	
	Если НЕ ЗначениеЗаполнено(СостояниеЗаявления) Тогда
		СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено;
	КонецЕсли;
	
	УжеОтправлено = СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено
					ИЛИ СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Отклонено
					ИЛИ СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено;
					
	Если СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено Тогда
		ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат();
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
		МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей");
		ИнтернетПоддержкаПользователейПодключена = МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки();
	КонецЕсли;
	
	ПодготовитьОформлениеФормы(ДоступныеРазделы);
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	Если Режим_СменаКонтактов Тогда
		
		Если НЕ ЗначениеЗаполнено(Телефон) И НЕ ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда
			ПроверяемыеРеквизиты.Добавить("ЭлектроннаяПочта");
			ПроверяемыеРеквизиты.Добавить("Телефон");
			Отказ = Истина;
		КонецЕсли;
		
		Если НЕ ПроверитьЭлектроннуюПочту(ЭлектроннаяПочта) Тогда
			ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Некорректно заполнен адрес электронной почты.'"), , "ЭлектроннаяПочта", , Отказ)
		КонецЕсли;
		
		Если НЕ ПроверитьНомерТелефона(Телефон) Тогда
			ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Некорректно заполнен номер телефона.'"), , "Телефон", , Отказ)
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	НастроитьДоступностьЭлементов();
	ПодключитьОбработчикОжидания("Подключаемый_ИзменитьРазмерыФормы", 0.2, Истина);
	
	Если ОбновитьАвтоматически Тогда
		Если СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Подготовлено") Тогда
			ОтправитьЗаявление();
		ИначеЕсли СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено")
			ИЛИ СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено") Тогда
			ЗавершитьНастройки();
		КонецЕсли;	
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если Модифицированность И НЕ ЗавершениеРаботы Тогда
		Отказ = Истина;
		ПодключитьОбработчикОжидания("Подключаемый_ЗакрытиеФормы", 0.1, Истина);
	Иначе
		ЗакрытьФорму();
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("ИнтернетПоддержкаПодключена") Тогда
		ИнтернетПоддержкаПользователейПодключена = Истина;
	ИначеЕсли ВРег(ИмяСобытия) = ВРег("ИнтернетПоддержкаОтключена") Тогда
		ИнтернетПоддержкаПользователейПодключена = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы
										
&НаКлиенте
Процедура Режим_СменаПароляПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура Режим_СменаКлючаМобильногоПриложенияПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура Режим_ПовторнаяОтправкаКодаАктивацииПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура Режим_ПовторнаяОтправкаКлючМобильногоПриложенияПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура Режим_СменаКонтактовПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура ТелефонПриИзменении(Элемент)
	
	Элементы.Телефон.ОтметкаНезаполненного = НЕ ПроверитьНомерТелефона(Телефон);
	ТелефонXML = ЗначениеТелефонаОблачнойПодписиПоПредставлению(Телефон);
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ТелефонНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
			"УправлениеКонтактнойИнформациейКлиент");
		
		ПараметрыФормы = МодульУправлениеКонтактнойИнформациейКлиент.ПараметрыФормыКонтактнойИнформации(
			ВидКонтактнойИнформацииТелефон(), ТелефонXML, Телефон);
		
		ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Мобильный телефон владельца'"));
		
		МодульУправлениеКонтактнойИнформациейКлиент.ОткрытьФормуКонтактнойИнформации(ПараметрыФормы, Элемент);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТелефонОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
		ТелефонXML = ВыбранноеЗначение.Значение;
		Телефон = ПолучитьПредставлениеТелефона(ВыбранноеЗначение.Представление);
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОК(Команда)
	
	Если НЕ ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	Если РежимВвода Тогда
		Ответ = РезультатРаботы(Истина);
		ЗакрытьФорму(Ответ);
	ИначеЕсли УжеОтправлено Тогда
		ЗавершитьНастройки();
	Иначе	
		ОтправитьЗаявление();
	КонецЕсли;		
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьТекстЗаявления(Команда)
	
	Если ЗначениеЗаполнено(ТекстЗаявления) Тогда
		ИмяФайла = ИдентификаторЗаявления + ".xml";
		ДанныеФайла = ПолучитьДвоичныеДанныеИзBase64Строки(ТекстЗаявления);
		АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла);
		ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, АдресФайла, ИмяФайла);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьЗаявление(Команда)
	
	Дополнение = ?(УжеОтправлено, НСтр("ru = 'и отправленного'"), "");
	ТекстВопроса = НСтр("ru = 'Данные заявления будет потеряны безвозвратно.
					|Хотите отказаться от оформленного %1 заявления.'");
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Дополнение);
	
	ОповещениеСледующее = Новый ОписаниеОповещения("ОтменитьЗаявлениеЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОповещениеСледующее,
				ТекстВопроса,
				РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ЦиклОкончанияНастройки

&НаКлиенте
Процедура ЗавершитьНастройки()
	
	СтатусПроцессаОжидания(Истина);
	
	Результат = ПолучитьСостояниеЗаявления();
	Если Результат.Выполнено И Результат.РегистрацияУспешна Тогда
		ИдентификаторАбонента = Результат.ИдентификаторАбонента;
		
		ПараметрыВызова = Новый Структура;
		ПараметрыВызова.Вставить("УчетнаяЗапись", УчетнаяЗапись);
		ПараметрыВызова.Вставить("Сертификат", Результат.ДанныеСертификата);
		ПараметрыВызова.Вставить("ШифрованныйБлок", Результат.ДанныеШифрованногоБлока);
		ПараметрыВызова.Вставить("УстановитьСертификат", Ложь);
		
		ПараметрыОперации = Новый Структура;
		ПараметрыОперации.Вставить("ОтобразитьОшибку", Истина);
		
		ОповещениеСледующее = Новый ОписаниеОповещения("ЗавершитьНастройкиОкончание", ЭтотОбъект);
		СервисКриптографииDSSСлужебныйКлиент.АктивироватьИУстановитьСертификат(ОповещениеСледующее, ПараметрыВызова, ПараметрыОперации);
		
	ИначеЕсли Результат.Выполнено И НЕ Результат.РегистрацияУспешна Тогда	
		СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отклонено");
		ЗавершитьНастройкиРезультат(Истина);
		
	ИначеЕсли ОбновитьАвтоматически Тогда
		ЗавершитьНастройкиРезультат(Ложь);
		
	КонецЕсли; 
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьНастройкиОкончание(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	Если РезультатВыполнения.Выполнено Тогда
		СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено");
		ЗавершитьНастройкиРезультат(Истина);
	Иначе
		СтатусПроцессаОжидания(Ложь);
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьНастройкиРезультат(Успешно)
	
	СтатусПроцессаОжидания(Ложь);
	
	ЗакрытьФорму(РезультатРаботы(Успешно));
	
КонецПроцедуры

&НаСервере
Функция ПолучитьСостояниеЗаявления()
	
	КлючПоиска	= Обработки.УправлениеПодключениемDSS.КлючПоискаУчетнойЗаписи(УчетнаяЗапись);
	Результат 	= Обработки.УправлениеПодключениемDSS.ПолучитьСостояниеЗаявления(УчетнаяЗапись, ИдентификаторЗаявления, КлючПоиска);
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#Область ЦиклОтправкиЗаявления

&НаКлиенте
Процедура ОтправитьЗаявление()
	
	ОповещениеСледующее = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеРезультат", ЭтотОбъект);
	
	ПараметрыЦикла = Новый Структура;
	ПараметрыЦикла.Вставить("Заявление", Неопределено);
	ПараметрыЦикла.Вставить("Подпись", Неопределено);
	ПараметрыЦикла.Вставить("ТикетПоддержки", Неопределено);
	ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеСледующее);
	
	СтатусПроцессаОжидания(Истина);
	
	Если ИнтернетПоддержкаПользователейПодключена Тогда
		ОтправитьЗаявлениеСформироватьЗаявление(ПараметрыЦикла);
	Иначе
		ОтправитьЗаявлениеПодключитьИнтернетПоддержку(ПараметрыЦикла);
	КонецЕсли;
	
КонецПроцедуры	

&НаКлиенте
Процедура ОтправитьЗаявлениеПодключитьИнтернетПоддержку(ПараметрыЦикла)
	
	ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении;
	
	Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
		ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине:
			|Библиотека интернет-поддержки пользователей не внедрена в конфигурацию.'"));
		Возврат;
	КонецЕсли;
	
	МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
		"ИнтернетПоддержкаПользователейКлиент");
	
	Если МодульИнтернетПоддержкаПользователейКлиент.ДоступноПодключениеИнтернетПоддержки() Тогда
		ОповещениеОПодключении = Новый ОписаниеОповещения("ОтправитьЗаявлениеПослеПодключенияИнтернетПоддержки", ЭтотОбъект, ПараметрыЦикла);
		МодульИнтернетПоддержкаПользователейКлиент.ПодключитьИнтернетПоддержкуПользователей(ОповещениеОПодключении, ЭтотОбъект);
		
	Иначе
		ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Для отправки заявления необходимо подключить Интернет-поддержку пользователей.'"));
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьЗаявлениеПослеПодключенияИнтернетПоддержки(РезультатВыполнения, ПараметрыЦикла) Экспорт
	
	ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении;
	ЛогинПоддержки = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(РезультатВыполнения, "Логин");
	ИнтернетПоддержкаПользователейПодключена = ЗначениеЗаполнено(ЛогинПоддержки);
	
	Если ИнтернетПоддержкаПользователейПодключена Тогда
		ОтправитьЗаявлениеСформироватьЗаявление(ПараметрыЦикла);
	Иначе
		ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Для отправки заявления необходимо проверить подключение услуги Интернет-поддержки пользователей.'"));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьЗаявлениеСформироватьЗаявление(ПараметрыЦикла)
	
	ДлительнаяОперация = ПолучитьТикетИнтернетПоддержки();
						
	ОбъектОповещения = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеПолучениеТикета", ЭтотОбъект, ПараметрыЦикла);
	СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОбъектОповещения, ДлительнаяОперация);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьЗаявлениеСформироватьЗаявлениеПолучениеТикета(ОтветСервиса, ПараметрыЦикла) Экспорт
	
	ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении;
	РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ПараметрыЦикла);
	
	Если НЕ РезультатВыполнения.Выполнено Тогда
		ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Не удалось получить тикет Интернет-поддержки.'"));
		
	ИначеЕсли ЗначениеЗаполнено(РезультатВыполнения.Тикет) Тогда
		ПараметрыЦикла.ТикетПоддержки = РезультатВыполнения;
		ПараметрыЦикла.Заявление = ПодготовитьТекстЗаявления(РезультатВыполнения);
		
		ДанныеДляПодписи = ПолучитьДвоичныеДанныеИзСтроки(ПараметрыЦикла.Заявление, "windows-1251");
		СвойстваСертификата = Новый Структура("Отпечаток", ОтпечатокСертификата);
		
		СвойстваПодписи = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь);
		СервисКриптографииDSSКлиентСервер.ПолучитьИнформациюДокументаДляПодписи(СвойстваПодписи, НСтр("ru = 'Подпись отправляемого заявления'"), "xml");
		
		ПараметрыОперации = Новый Структура;
		ПараметрыОперации.Вставить("ОтобразитьОшибку", Истина);

		ОповещениеСледующее = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеПослеПодписание", ЭтотОбъект, ПараметрыЦикла);
		СервисКриптографииDSSКлиент.Подписать(ОповещениеСледующее, УчетнаяЗапись, ДанныеДляПодписи, СвойстваПодписи, СвойстваСертификата, ПараметрыОперации);
		
	Иначе
		ИнтернетПоддержкаПользователейПодключена = Ложь;
		ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Неверные параметры подключения к Интернет-поддержке'"));
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьЗаявлениеСформироватьЗаявлениеПослеПодписание(РезультатВыполнения, ПараметрыЦикла) Экспорт
	
	ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении;
	
	Если РезультатВыполнения.Выполнено Тогда
		ПараметрыЦикла.Подпись = РезультатВыполнения.Результат;
		ДлительнаяОперация = ОтправитьЗаявлениеНаСервере(ПараметрыЦикла.Заявление, ПараметрыЦикла.Подпись, ПараметрыЦикла.ТикетПоддержки);
							
		ОбъектОповещения = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеЗавершение", ЭтотОбъект, ПараметрыЦикла);
		СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОбъектОповещения, ДлительнаяОперация);
		
	Иначе
		ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Неопределено);
		
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьЗаявлениеСформироватьЗаявлениеЗавершение(ОтветСервиса, ПараметрыЦикла) Экспорт
	
	ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении;
	
	РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ПараметрыЦикла);
	Если РезультатВыполнения.Выполнено Тогда
		СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено");
		ДатаЗаявления = РезультатВыполнения.ДатаОтправки;
		ИдентификаторЗаявления = РезультатВыполнения.ИдентификаторДокументооборота;
		СтатусПроцессаОжидания(Ложь);
		ЗакрытьФорму(РезультатРаботы(Истина));
	Иначе
		ПоказатьОшибку(ОповещениеОЗавершении, РезультатВыполнения.Ошибка);
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьЗаявлениеСформироватьЗаявлениеРезультат(РезультатВыполнения, ПараметрыЦикла) Экспорт
	
	СтатусПроцессаОжидания(Ложь);
	
КонецПроцедуры

&НаСервере
Функция ПодготовитьТекстЗаявления(ТикетПоддержки)
	
	РеквизитыЗаявления = ПодготовитьДанныеЗаявления();
	Результат = Обработки.УправлениеПодключениемDSS.ПодготовитьЗаявлениеXML(РеквизитыЗаявления, УчетнаяЗапись, ТикетПоддержки);
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ПолучитьТикетИнтернетПоддержки()
	
	АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
	ПараметрыВызова = Новый Структура;
	ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата);
	
	Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ПолучитьТикетИнтернетПоддержкиПользователя", ПараметрыВызова);
	
КонецФункции

&НаСервере
Функция ОтправитьЗаявлениеНаСервере(Заявление, Подпись, ТикетПоддержки)
	
	АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
	ПараметрыВызова = Новый Структура;
	ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата);
	ПараметрыВызова.Вставить("Заявление", Заявление);
	ПараметрыВызова.Вставить("ПодписьЗаявления", Подпись);
	ПараметрыВызова.Вставить("ТикетПользователя", ТикетПоддержки);
	ПараметрыВызова.Вставить("ИдентификаторДокументооборота", ИдентификаторЗаявления);
	
	Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ОтправитьЗаявлениеНаПортал", ПараметрыВызова);
	
КонецФункции

#КонецОбласти

#Область Прочие

&НаКлиенте
Процедура ПоказатьОшибку(ОповещениеЗавершения, ТекстОшибки)
	
	СервисКриптографииDSSКлиент.ВывестиОшибку(ОповещениеЗавершения, ТекстОшибки);
	
КонецПроцедуры

&НаКлиенте
Процедура СтатусПроцессаОжидания(НовыйСтатус)
	
	ПроцессОжидания = НовыйСтатус;
	НастроитьДоступностьЭлементов();

КонецПроцедуры

&НаКлиенте
Процедура СменаРежима()
	
	Модифицированность = Истина;
	НастроитьДоступностьЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьДоступностьЭлементов()
	
	Изменять = Истина;
	Если СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Подготовлено") Тогда
		Изменять = НЕ ОбновитьАвтоматически;
	ИначеЕсли СостояниеЗаявления <> ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено") Тогда
		Изменять = Ложь;
	КонецЕсли;
	
	ДоступныКонтакты = Режим_СменаКлючаМобильногоПриложения ИЛИ Режим_СменаПароля
						ИЛИ Режим_ПовторнаяОтправкаКлючМобильногоПриложения
						ИЛИ Режим_ПовторнаяОтправкаКодаАктивации;
	Элементы.ГруппаКонтактыПерваяСтрока.Доступность = Изменять И ДоступныКонтакты;
	Элементы.Телефон.Доступность = Режим_СменаКонтактов И Изменять И ДоступныКонтакты;
	
	Элементы.ГруппаСменаПароля.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять;
	Элементы.ГруппаСменаКлюча.Доступность = НЕ Режим_СменаПароля И Изменять
					И НЕ Режим_ПовторнаяОтправкаКлючМобильногоПриложения И НЕ Режим_ПовторнаяОтправкаКодаАктивации;
	Элементы.ГруппаПовторКлюча.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять;
	Элементы.ГруппаПовторКодаАвторизации.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять;
	Элементы.ГруппаПовторКодаАвторизации.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять;
	Элементы.Отправить.Доступность = Изменять И НЕ ОбновитьАвтоматически И НЕ ПроцессОжидания;
	Элементы.ПолучитьТекстЗаявления.Доступность = ЗначениеЗаполнено(ТекстЗаявления);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ИзменитьРазмерыФормы()
	
	Элементы.ГруппаКонтакты.Видимость = НЕ Элементы.ГруппаКонтакты.Видимость;
	Элементы.ГруппаКонтакты.Видимость = НЕ Элементы.ГруппаКонтакты.Видимость;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЗакрытиеФормы()
	
	ОповещениеСледующее = Новый ОписаниеОповещения("ЗакрытьФормуПослеВыбора", ЭтотОбъект);
	ПоказатьВопрос(ОповещениеСледующее, 
				НСтр("ru = 'Сохранить изменения?'"),
				РежимДиалогаВопрос.ДаНет);
				
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму(РезультатВыбора = Неопределено)
	
	Модифицированность = Ложь;
	Закрыть(РезультатВыбора);
	
КонецПроцедуры

&НаКлиенте
Функция РезультатРаботы(Успешно = Истина)
	
	ДанныеЗаявления = ПодготовитьДанныеЗаявления();
	
	Результат = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Успешно);
	Результат.Вставить("Результат", Новый Структура);
	Результат.Результат.Вставить("СодержаниеЗаявления", ДанныеЗаявления);
	Результат.Результат.Вставить("СостояниеЗаявления", СостояниеЗаявления);
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ЗакрытьФормуПослеВыбора(ВыборПользователя, ДополнительныеПараметры) Экспорт
	
	Если ВыборПользователя = КодВозвратаДиалога.Да Тогда
		Если СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено") Тогда
			СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Подготовлено");
		КонецЕсли;	
		Ответ = РезультатРаботы(Истина);
	Иначе
		Ответ = РезультатРаботы(Ложь);
	КонецЕсли;	
	
	ЗакрытьФорму(Ответ);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьЗаявлениеЗавершение(ВыборПользователя, ДополнительныеПараметры) Экспорт
	
	ОчиститьЗаявление();
	Ответ = РезультатРаботы(Истина);
	ЗакрытьФорму(Ответ);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьЭлектроннуюПочту(ЭлектроннаяПочта)
	
	Результат = НЕ ЗначениеЗаполнено(ЭлектроннаяПочта) 
					ИЛИ ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ЭлектроннаяПочта);
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПроверитьНомерТелефона(НомерТелефона)
	
	Представление = Обработки.УправлениеПодключениемDSS.ПолучитьПредставлениеТелефона(НомерТелефона);
	Результат = ЗначениеЗаполнено(Представление) ИЛИ НЕ ЗначениеЗаполнено(НомерТелефона);
	
	Возврат Результат;
	
КонецФункции	

&НаСервереБезКонтекста
Функция ВидКонтактнойИнформацииТелефон()
	
	МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
	Результат = МодульУправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления["ТипыКонтактнойИнформации"].Телефон);
			
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция ЗначениеТелефонаОблачнойПодписиПоПредставлению(ТекущийТелефон)
	
	Результат = "";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		Результат = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(ТекущийТелефон, Перечисления["ТипыКонтактнойИнформации"].Телефон);
	КонецЕсли;	
	
	Возврат Результат;
			
КонецФункции

&НаСервере
Процедура ЗаполнитьФормуДаннымиЗаявления(ВсеРеквизиты)
	
	ДатаЗаявления			= ВсеРеквизиты.ДатаЗаявления;
	ИдентификаторЗаявления	= ВсеРеквизиты.ИдентификаторЗаявления;
	ИдентификаторАбонента	= ВсеРеквизиты.ИдентификаторАбонента;
	СостояниеЗаявления		= ВсеРеквизиты.СостояниеЗаявления;
	ИНН 					= ВсеРеквизиты.ИНН;
	КПП 					= ВсеРеквизиты.КПП;
	Телефон 				= ВсеРеквизиты.НомерТелефона;
	ТелефонXML 				= ВсеРеквизиты.НомерТелефонаXML;
	НомерТелефонаПроверен 	= ВсеРеквизиты.НомерТелефонаПроверен;
	ЭлектроннаяПочта    	= ВсеРеквизиты.ЭлектроннаяПочта;
	ЭлектроннаяПочтаПроверена = ВсеРеквизиты.ЭлектроннаяПочтаПроверена;
	Режим_СменаКонтактов 	= ВсеРеквизиты.Режим_СменаКонтактов;
	Режим_ПовторнаяОтправкаКлючМобильногоПриложения = ВсеРеквизиты.Режим_ПовторнаяОтправкаКлючМобильногоПриложения;
	Режим_ПовторнаяОтправкаКодаАктивации = ВсеРеквизиты.Режим_ПовторнаяОтправкаКодаАктивации;
	Режим_СменаКлючаМобильногоПриложения = ВсеРеквизиты.Режим_СменаКлючаМобильногоПриложения;
	Режим_СменаПароля 		= ВсеРеквизиты.Режим_СменаПароля;
	ТекстЗаявления			= ВсеРеквизиты.ТекстЗаявления;
	
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеЗаявления(СодержимоеЗаявления = Неопределено)
	
	Результат = Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления();
	ДанныеЗаявления = Неопределено;
	
	Если ТипЗнч(СодержимоеЗаявления) = Тип("СправочникСсылка.УчетныеЗаписиDSS") Тогда
		
		РеквизитЗаявления = Неопределено;
		Если СервисКриптографииDSSСлужебный.ПроверитьПраво("УчетныеЗаписиDSS") Тогда
			РеквизитЗаявления	= ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СодержимоеЗаявления, "СодержаниеЗаявления", Истина);
		КонецЕсли;
		
		Если РеквизитЗаявления <> Неопределено Тогда
			ДанныеЗаявления	= РеквизитЗаявления.Получить();
		КонецЕсли;
				
	Иначе
		ДанныеЗаявления = СодержимоеЗаявления;	
	КонецЕсли;
	
	Если ТипЗнч(ДанныеЗаявления) = Тип("Структура") Тогда
		ЗаполнитьЗначенияСвойств(Результат, ДанныеЗаявления);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ПодготовитьДанныеЗаявления()
	
	Результат = Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления();
	Результат.ДатаЗаявления = ДатаЗаявления;
	Результат.ИдентификаторЗаявления = ИдентификаторЗаявления;
	Результат.ИдентификаторАбонента = ИдентификаторАбонента;
	Результат.СостояниеЗаявления = СостояниеЗаявления;
	Результат.ИНН = ИНН;
	Результат.КПП = КПП;
	Результат.НомерТелефона = Телефон;
	Результат.НомерТелефонаXML = ТелефонXML;
	Результат.НомерТелефонаПроверен = НомерТелефонаПроверен;
	Результат.ЭлектроннаяПочта = ЭлектроннаяПочта;
	Результат.ЭлектроннаяПочтаПроверена = ЭлектроннаяПочтаПроверена;
	Результат.СрокQRКода = СрокQRКода;
	Результат.Режим_СменаКонтактов = Режим_СменаКонтактов;
	Результат.Режим_ПовторнаяОтправкаКлючМобильногоПриложения = Режим_ПовторнаяОтправкаКлючМобильногоПриложения;
	Результат.Режим_ПовторнаяОтправкаКодаАктивации = Режим_ПовторнаяОтправкаКодаАктивации;
	Результат.Режим_СменаКлючаМобильногоПриложения = Режим_СменаКлючаМобильногоПриложения;
	Результат.Режим_СменаПароля = Режим_СменаПароля;
	Результат.ТекстЗаявления = ТекстЗаявления;
	Результат.ОтпечатокСертификата = ОтпечатокСертификата;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ОчиститьЗаявление()
	
	ВсеРеквизиты = Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления();
	ЗаполнитьФормуДаннымиЗаявления(ВсеРеквизиты);
	
КонецПроцедуры

&НаСервере
Процедура ПодготовитьОформлениеФормы(ДоступныеРазделы)
	
	Если ЗначениеЗаполнено(ТекущийНомер) Тогда
		Элементы.ДекорацияТекущийНомер.Заголовок = НСтр("ru = 'Текущий номер телефона'") + ": " + ТекущийНомер;
	Иначе
		Элементы.ДекорацияТекущийНомер.Заголовок = "";
	КонецЕсли;	
	Элементы.ДекорацияТекущийНомер.Видимость = ЗначениеЗаполнено(Элементы.ДекорацияТекущийНомер.Заголовок);
	
	Элементы.ДекорацияЛогина.Заголовок = НСтр("ru = 'Настройка для'") + ": " + СокрЛП(УчетнаяЗапись);
	Элементы.СостояниеЗаявления.Видимость = НЕ РежимВвода;
	Элементы.ДатаЗаявления.Видимость = НЕ РежимВвода;
	Элементы.ПолучитьТекстЗаявления.Видимость = НЕ РежимВвода;
	Элементы.ОтменитьЗаявление.Видимость = НЕ РежимВвода И УжеОтправлено;
	
	Если РежимВвода Тогда
		Заголовок = НСтр("ru = 'Дополнительные настройки издания сертификата'");
		Элементы.ДекорацияЛогина.Видимость = Ложь;
		Элементы.Отправить.Заголовок = НСтр("ru = 'ОК'");
	ИначеЕсли УжеОтправлено Тогда
		Элементы.Отправить.Заголовок = НСтр("ru = 'Обновить'");
	Иначе
		Элементы.Отправить.Заголовок = НСтр("ru = 'Отправить'");
	КонецЕсли;
	
	Раздел1 = 1;
	Раздел2 = 2;
	Раздел3 = 3;
	Раздел4 = 4;
	
	СписокРазделов = Новый Структура;
	СписокРазделов.Вставить("Пароль", "Раздел1");
	СписокРазделов.Вставить("НовыйQRКод", "Раздел2");
	СписокРазделов.Вставить("Повтор", "Раздел3");
	СписокРазделов.Вставить("Контакты", "Раздел4");

	Если ДоступныеРазделы.Количество() = 0 Тогда
		Для каждого СтрокаКлюча Из СписокРазделов Цикл
			ДоступныеРазделы.Добавить(СтрокаКлюча.Ключ);
		КонецЦикла;	
	КонецЕсли;
	
	Для каждого СтрокаКлюча Из СписокРазделов Цикл
		ИмяЭлемента = СтрокаКлюча.Значение;
		Элементы[ИмяЭлемента].Доступность = ДоступныеРазделы.Найти(СтрокаКлюча.Ключ) <> Неопределено;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат()
	
	ДанныеЗаявления = Обработки.УправлениеПодключениемDSS.ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат(УчетнаяЗапись);
		
	ТекущаяЭлектроннаяПочта = ДанныеЗаявления.ОблачнаяПодписьЭлектроннаяПочта;
	ТекущийНомер = ДанныеЗаявления.ОблачнаяПодписьМобильныйТелефон;
	ТекущийНомерXML = ДанныеЗаявления.ОблачнаяПодписьМобильныйТелефонXML;
	ИНН = ДанныеЗаявления.ИНН;
	КПП = ДанныеЗаявления.КПП;
	ОтпечатокСертификата = ДанныеЗаявления.ОтпечатокСертификата;
	
	Если НЕ ЗначениеЗаполнено(ИдентификаторАбонента) Тогда
		ИдентификаторАбонента = ДанныеЗаявления.ИдентификаторАбонента;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьПредставлениеТелефона(ТекущийНомерТелефона)
	
	Результат = Обработки.УправлениеПодключениемDSS.ПолучитьПредставлениеТелефона(ТекущийНомерТелефона);
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#КонецОбласти
